今天要介紹的是Retrofit,Retrofit是專為API連線來取得資料,而Retrofit與API連線的效率非常高,最特別的是其規範的REST框架讓程式高度解耦,好寫易維護。
一樣的請到build.grade(Module: app)的dependencies加入依賴。
dependencies{
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
}
第二行是用Google的Gson套件作為資料處理的converter,Retrofit都整合好了所以我們之後只要一行程式碼就能用Gson處理資料。
在AndroidManifet加入網路權限:
<uses-permission android:name="android.permission.INTERNET" />
Retrofit會自動將連線取得的資料轉成物件便於做後續處理,而這是我所使用的json。
接下來我們看到裡面種共有(id,title,body,userId)這四種資料,我們就建一個物件如下,注意欄位名稱要跟API裡的一致。
public class Post {
private String id;
private String title;
private String body;
private String userId;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
}
我們可以不用打那麼多,你只要先設定完變數後,案右鍵選Generate這一個,進入後再按Getter and Setter就ok了。
Interface就是各個連線的接口,每個連線是用GET或POST及其路徑、參數都寫在這裡。
public interface MyAPI {
@GET("posts/1") // 設置一個GET連線,路徑為posts/1
Call<Post> getpost(); // 取得的回傳資料用Post物件接收,連線名稱取為getpost
}
建立連線的基底。
public class ApiClient {
private ApiService apiService;
public ApiService getApiService() {
// baseUrl: 定義 API 網域網址,即是我們剛剛拆出來的前綴共用的部分
// ddConverterFactory: 定義要將資料轉成什麼格式
retrofit2.Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://jsonplaceholder.typicode.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
apiService = retrofit.create(ApiService.class);
return apiService;
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//new出實例
ApiClient apiClient=new ApiClient();
//執行連線服務,透過 Callback 來等待回傳成功或失敗的資料
apiClient.getApiService().getpost().enqueue(new Callback<Post>() {
//回傳成功
@Override
public void onResponse(Call<Post> call, Response<Post> response) {
//列印回傳資料
Log.e("note",response.body().getId());
Log.e("note",response.body().getUserId());
Log.e("note",response.body().getTitle());
Log.e("note",response.body().getBody());
}
//回傳失敗
@Override
public void onFailure(Call<Post> call, Throwable t) {
//列印錯誤訊息
Log.d("note", "response: " + t.toString());
}
});
}
}
最後在下方的Logcat漸能看到回傳的資料了。